#ifndef COMPLIE_OLINE
#include "header.cpp"
#endif
#include <ctime>
#include <chrono> 

// 正解
int subarraySum(vector<int>& nums, int k) {
    int size = nums.size(), sum = 0, ret = 0;
    // 创建一个哈希表
    unordered_map<int, int> hash;
    // 初始化哈希表
    hash[0] = 1;
    // 计算到i位置的前缀和时，哈希表里面只存了[0, i - 1]区间的前缀和
    for (int i = 0; i < size; i++) {
        sum = sum + nums[i]; // 计算当前位置的前缀和
        if (hash.count(sum - k)) {
            ret += hash[sum - k]; // 统计个数
        } 
        hash[sum]++;

    }
    return ret;
}

int main() {
    srand(time(nullptr));
    Solution s;
    int cnt = rand() % 10000 + 1; // 测试用例个数
    // 获取当前时间点  
    auto start = std::chrono::high_resolution_clock::now();  
    for (int i = 1; i <= cnt; i++) {
        int len = rand() % 20 + 2;
        int k = rand() % 1000;
        vector<int> nums(len);
        for (int j = 0; j < len; j++) {
            nums[j] = rand() % 1000;
        }
        int true_ret = subarraySum(nums, k); 
        int test_ret = s.subarraySum(nums, k);// **********************************
        if (true_ret != test_ret) {
            cerr << "测试通过" << i - 1 << "个测试用例" << endl;
            cerr << "用例" << i << ":[";
            for (auto x : nums) {
                cerr << x << " ";
            }
            cerr << "]" << endl;
            cerr << "k: " << k << endl;
            cerr << "预计输出: " << true_ret << endl;
            cerr << "实际输出: " << test_ret << endl;
            return 0;
        }
    }
    cout << "通过所有的" << cnt << "个测试用例!" << endl;
    // 获取结束时间点  
    auto end = std::chrono::high_resolution_clock::now();  
  
    // 计算两个时间点之间的持续时间  
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);  
  
    // 输出持续时间（毫秒）  
    std::cout << "运行时间: " << duration.count() << " ms" << std::endl;  
    return 0;
}

